package controllers;

import play.*;
import play.mvc.*;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import models.*;

public class Application extends Controller 
{

        public static void inscription() {render();}
        
        public static void sinscrire(String login, String password, String prenom, String nom, String jour_naissance, String mois_naissance, String annee_naissance, String adresse, String codePostal, String ville, String email)
        {
        	// v�rification de l'adresse mail, de la date de naissance et du code postal
        	
        	Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
        	Matcher m = p.matcher(email);
        	boolean matchFound = m.matches();
        	
        	if (matchFound)
        	System.out.println("Valid Email Id.");
        	else
        	System.out.println("Invalid Email Id.");
        	
        	int cp = 0;
        	if(!codePostal.equals(""))
        	{
        		cp = Integer.parseInt(codePostal);
        	}
        	
        	String pattern = "dd/MM/yyyy";
            SimpleDateFormat sdf = new SimpleDateFormat();
            String strDate = jour_naissance + "/" + mois_naissance + "/" + annee_naissance;
            Date date = null;

            sdf.applyPattern(pattern);
            try {
				date = sdf.parse(strDate);
			} catch (ParseException e) {
				e.printStackTrace();
			}

			Trimaran t = new Trimaran("mon trimaran", 1);
            t.create();
            t.save();
            User u = new User(login,  password,  prenom,  nom, date, adresse, cp, ville, email, new Date(), t.id);
            u.create();
            u.save();
            index();
        }
        
        public static void repondre(Message topic, User user, String reponse)
        {               
            Reponse rep = new Reponse(topic, user, reponse);
            rep.save();
            rep.create();
            viewMessages(topic.id);
        }
        
        public static void deconnexion()
        {
            session.put("isConnected", null);
            session.put("login", null);
            session.put("id", null);
            index();
        }
        
        public static void connecter(String login, String password)
        {
            User u = User.connect(login, password);
            if(u != null)
			{
				session.put("login", login);
				session.put("id", u.id);
				session.put("isAdmin", u.isAdmin);
				session.put("isConnected", true);
				u.date_derniere_connexion = new Date();
				u.save();
			}
			else login("Erreur de login/mot de passe");
            index();
        }
        
        public static void moncompte(String partie)
        {
        	if(partie.equals("compte")) {
        		String title = "Vos coordonnées";
	        	User user = User.findById(Long.parseLong(session.get("id")));
	            render(user);
	            render(title);
        	}
        	
        	if(partie.equals("trimaran")) {
        		User user = User.findById(Long.parseLong(session.get("id")));
            	Trimaran trimaran = Trimaran.findById(user.id_trimaran);
            	render(trimaran);
        	}
        	
        	if(partie.equals("temps")) {
        		render();
        	}
        }
        
        public static void modifier_compte()
        {
        	
        }
        
        public static void modifier_trimaran()
        {
        	
        }
        
        public static void administration(String partie)
        {
        	if(partie.equals("utilisateurs")) {
        		List<User> utilisateurs = User.findAll();
    			render(utilisateurs);
        	}
        	
        	if(partie.equals("forums")) {
        		
        	}
        	
        	if(partie.equals("regates")) {
        		List<Regate> regates = Regate.findAll();
        		String ajout = "ok";
        		render(regates, ajout);
        	}
        	
        	if(partie.equals("ajouter_regate")) {
        		String ajouter_regate = "ok";
        		render(ajouter_regate);
        	}
        	
        	if(partie.equals("ajouter_regate_suivant")) {
        		String ajouter_regate_suivant = "ok";
        		render(ajouter_regate_suivant);
        	}
        	
        	render();
        }
        
        public static void ajouter_regate(String libelle, String nombre_inscriptions, String jour_depart, String mois_depart, String annee_depart, String heure_depart, String minutes_depart, String jour_limite, String mois_limite, String annee_limite, String heure_limite, String minutes_limite, String limite_temps)
        {
        	
        	String pattern = "dd/MM/yyyy HH:mm";
            SimpleDateFormat sdf = new SimpleDateFormat();
            String strDate = jour_depart + "/" + mois_depart + "/" + annee_depart + " " + heure_depart + ":" + minutes_depart;
            String strDate2 = jour_limite + "/" + mois_limite + "/" + annee_limite + " " + heure_limite + ":" + minutes_limite;
            Date date = null;
            Date date2 = null;
            
            sdf.applyPattern(pattern);
            try {
				date = sdf.parse(strDate);
				date2 = sdf.parse(strDate2);
			} catch (ParseException e) {
				e.printStackTrace();
			}
        	javax.swing.JOptionPane.showMessageDialog(null, date);
        	Regate r = new Regate(libelle, Integer.parseInt(nombre_inscriptions), date2, date, Integer.parseInt(limite_temps));
    		r.create();
            r.save();
            session.put("id_regate", r.id);
            administration("ajouter_regate_suivant");
        }
        
        public static void ajouter_regate_suivant(double latitude_depart, double longitude_depart, double latitude_depart_bis, double longitude_depart_bis, double latitude_point_1, double longitude_point_1, double latitude_point_1_bis, double longitude_point_1_bis,double latitude_point_2, double longitude_point_2, double latitude_point_2_bis, double longitude_point_2_bis, double latitude_point_3, double longitude_point_3, double latitude_point_3_bis, double longitude_point_3_bis, double latitude_arrivee, double longitude_arrivee, double latitude_arrivee_bis, double longitude_arrivee_bis)
        {
        	String action = null;
        	int i = 0;
        	javax.swing.JOptionPane.showMessageDialog(null,latitude_depart);
        	if(latitude_depart + longitude_depart + latitude_depart_bis + longitude_depart_bis == 0.0)
        	{
        		javax.swing.JOptionPane.showMessageDialog(null, "Vous avez oublié de rensigner la ligne de départ");
        		administration("ajouter_regate_suivant");
        	}
        	else
        	{
        		i++;
        		Ligne_passage l_d = new Ligne_passage(i, latitude_depart, longitude_depart, latitude_depart_bis, longitude_depart_bis, Integer.parseInt(session.get("id_regate")));
        		l_d.create();
        		l_d.save();
        	}
        	
        	if(latitude_point_1 + longitude_point_1 + latitude_point_1_bis + longitude_point_1_bis == 0.0){	}
        	else{
        		i++;
        		Ligne_passage l_1 = new Ligne_passage(i, latitude_point_1, longitude_point_1, latitude_point_1_bis, longitude_point_1_bis, Integer.parseInt(session.get("id_regate")));
        		l_1.create();
        		l_1.save();
        	}
        	
        	if(latitude_point_2 + longitude_point_2 + latitude_point_2_bis + longitude_point_2_bis == 0.0){ }
        	else{ 
        		i++;
        		Ligne_passage l_2 = new Ligne_passage(i, latitude_point_2, longitude_point_2, latitude_point_2_bis, longitude_point_2_bis, Integer.parseInt(session.get("id_regate")));
        		l_2.create();
        		l_2.save();
        	}
        	
        	if(latitude_point_3 + longitude_point_3 + latitude_point_3_bis + longitude_point_3_bis == 0.0){ }
        	else{ 
        		i++;
        		Ligne_passage l_3 = new Ligne_passage(i, latitude_point_3, longitude_point_3, latitude_point_3_bis, longitude_point_3_bis, Integer.parseInt(session.get("id_regate")));
        		l_3.create();
        		l_3.save();
        	}
        	
        	if(latitude_arrivee + longitude_arrivee + latitude_arrivee_bis + longitude_arrivee_bis == 0.0)
        	{
        		javax.swing.JOptionPane.showMessageDialog(null, "Vous avez oublié de rensigner la ligne d'arrivée");
        		action = "ajouter_regate_suivant";
        	}
        	else
        	{
        		i++;
        		Ligne_passage l_a = new Ligne_passage(i, latitude_arrivee, longitude_arrivee, latitude_arrivee_bis, longitude_arrivee_bis, Integer.parseInt(session.get("id_regate")));
        		l_a.create();
        		l_a.save();
        		administration("regates");
        	}
        	
        	if(action == "ajouter_regate_suivant")
        	{
        		List<Ligne_passage> l_p = Ligne_passage.find("id_regate", Integer.parseInt(session.get("id_regate"))).fetch();
        		l_p.removeAll(l_p);
        		administration("ajouter_regate_suivant");
        	}
        	
        }
        
        public static void login()
        {
            render();
        }
		public static void login(String error)
		{
			render(error);
		}
        
        public static void index() 
        {
        	if(session.get("id") == null)
        	{
        		render();
        		
        	}
        	else
        	{
        		User user = User.findById(Long.parseLong(session.get("id")));
	        	Navigation navigation = Navigation.find("id_trimaran", user.id_trimaran).first();
	        	if(navigation != null)
	        	{
	        		String rapport;
	        		if(navigation.statut.equals("en attente"))
	        		{
	        			rapport = "Vous êtes déjà inscrit à une course";
	        			render(rapport);
	        		}
	        		else
	        		{
	        			rapport = "Vous êtes actuellement en train de participer à une régate.";
	        			render(rapport);
	        		}
	        	}
	        	else
	        	{
	        		List<Regate> regates = listerRegates();
	                render(regates);
	        	}
        	}
        	
        }
		
		public static List<Regate> listerRegates()
		{
			List<Regate> regates = Regate.findAll();
			return(regates);
		}
		
		public static void inscrire_course(long id)
		{
			Regate regate = Regate.find("byId", id).first();
			Ligne_passage ligne_depart = regate.get_ligne_depart();
			double pos_depart_lat = (regate.get_ligne_depart().latitude_point_1 + regate.get_ligne_depart().latitude_point_2) / 2;
			double pos_depart_long = (regate.get_ligne_depart().longitude_point_1 + regate.get_ligne_depart().longitude_point_2) / 2;
			User user = User.findById(Long.parseLong(session.get("id")));
			Navigation navigation = new Navigation(id, user.id_trimaran, regate.date_depart, null, "en attente", pos_depart_lat, pos_depart_long, 0, 0);
			navigation.create();
            navigation.save();
			index();
		}
        
        public static void forum()
        {
            List<Forum> forums = Forum.findAll();
            render(forums);
        }
        
        public static void jeu()
        {
            render();
        }
        
        public static void viewForum(int id)
        {
            List<Message> posts = Message.find("byId_Topic", id).fetch();
            render(posts);
        }
        
        public static void viewMessages(long id)
        {
            Message post = Message.find("byId", id).first();
            List<Reponse> reponses = Reponse.find("byId_Topic_id", id).fetch();
            render(post, reponses);
        }

        public static void viewProfile(long userid)
        {
            User user = User.find("byId", userid).first();
            render(user);
        }
}
